package com.ld.admin.service.user;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.servlet.http.HttpServletRequest;

import com.ld.admin.config.SystemStaticParams;
import com.ld.admin.model.system.SysMenuModel;
import com.ld.admin.model.system.SysRoleModel;
import com.ld.admin.model.system.SysRolePermissionModel;
import com.ld.admin.model.system.SysUserTempLogModel;
import com.ld.admin.model.system.SystemUser;
import com.ld.admin.plugin.cache.PermCacheUtil;
import com.ld.common.service.ProjectBasicService;
import com.ld.common.util.SharedVarsUtil;
import com.ld.shieldsb.common.composition.util.PKUtil;
import com.ld.shieldsb.common.core.collections.ListUtils;
import com.ld.shieldsb.common.core.model.Result;
import com.ld.shieldsb.common.web.util.Web;
import com.ld.shieldsb.common.web.util.WebUtil;
import com.ld.shieldsb.dao.model.QueryModel;

public class UserCommonService extends ProjectBasicService {
    public static final String TEMP_USER_LOG_LOGIN = "1"; // 登录
    public static final String TEMP_USER_LOG_LOGOUT = "2"; // 退出
    public static final String TEMP_USER_LOG_LOGINERR = "3"; // 登录失败
    public static final String TEMP_USER_LOG_UPDATE = "4"; // 修改4
    public static final String TEMP_USER_LOG_DISABLE = "5"; // 停用
    public static final String TEMP_USER_LOG_ENABLE = "6"; // 启用
    public static final String TEMP_USER_LOG_OTHER = "9"; // 其他

    /**
     * 记录临时账号日志
     * 
     * @Title recordTempUserLog
     * @author 吕凯
     * @date 2019年10月12日 下午3:46:13
     * @param user
     * @param userTemp
     * @param message
     *            void
     */
    public void recordTempUserLog(SystemUser user, Long userTempId, String type, String message) {
        if (userTempId != null) {
            // 记录日志
            SysUserTempLogModel tempLog = new SysUserTempLogModel();
            tempLog.setId(PKUtil.nextId());
            tempLog.setAccountId(userTempId);
            tempLog.setCreateBy(user.getId());
            tempLog.setCreateName(user.getUserName());
            tempLog.setCreateTime(new Date());
            tempLog.setType(type);
            tempLog.setRemarks(message);
            tempLog.setIp(WebUtil.getIpAddr(request));
            getBaseDAO().save(tempLog);
        }
    }

    /**
     * 记录登录信息
     * 
     * @Title recordLoginInfo
     * @author 吕凯
     * @date 2019年10月21日 下午2:02:05
     * @param request
     * @param user
     * @return Result
     */
    public Result recordLoginInfo(HttpServletRequest request, SystemUser user) {
        Result result;
        SystemUser userUpd = new SystemUser();
        userUpd.setId(user.getId());
        userUpd.setLastLoginIp(WebUtil.getIpAddr(request));
        userUpd.setLastLoginTime(new Date()); //
        userUpd.setLoginCount(user.getLoginCount() + 1);
        result = super.addOrUpdate(userUpd, true);
        return result;
    }

    /**
     * 获取用户的角色
     * 
     * @Title getRoles
     * @author 吕凯
     * @date 2020年9月16日 下午2:13:32
     * @param request
     * @param userId
     * @return List<SysRoleModel>
     */
    public List<SysRoleModel> getRoles(HttpServletRequest request, Long userId) {
        QueryModel roleQueryModel = new QueryModel();
        roleQueryModel.addM2MIdLink(SysRoleModel.class, SysRoleModel::getUsers, userId);
        List<SysRoleModel> userRoles = getList(SysRoleModel.class, roleQueryModel); // 获取对应的角色
        return userRoles;
    }

    /**
     * 获取用户角色和权限
     * 
     * @Title getRoleAndPerms
     * @author 吕凯
     * @date 2019年10月21日 下午2:04:43
     * @param request
     * @param user
     *            void
     */
    public void getRoleAndPerms(HttpServletRequest request, SystemUser user) {
        List<SysRoleModel> userRoles = getRoles(request, user.getId()); // 获取对应的角色
        // 使用fectchLinks的方式获取
//            fetchLinks(user, SystemUser::getUserRoles, new QueryModel());
//            List<SysRoleModel> userRoles = user.getUserRoles();

//            List<SysUserRolesModel> userRolesLinks = getList(SysUserRolesModel.class, "userId", user.getId()); // 获取对应的角色
        if (ListUtils.isNotEmpty(userRoles)) {
//                List<SysRoleModel> userRoles = new ArrayList<>();
            Set<String> permUrls = new HashSet<>();
            Set<String> permIds = new HashSet<>();
//                for (SysUserRolesModel userRoleLink : userRolesLinks) {
//                    SysRoleModel roleModel = RoleCacheUtil.getRoleByid(userRoleLink.getRoleId());
            for (SysRoleModel roleModel : userRoles) {
                if (roleModel != null) {
                    List<SysRolePermissionModel> rolePermsLinks = getList(SysRolePermissionModel.class, "roleId", roleModel.getId()); // 获取角色对应的权限
                    for (SysRolePermissionModel rolePerm : rolePermsLinks) {
                        SysMenuModel perm = PermCacheUtil.getPermByid(rolePerm.getPermissionId());
                        if (perm != null) {
                            permUrls.add(SharedVarsUtil.delInnerVars(perm.getHref(), perm));
                            permIds.add(perm.getId() + "");
                        }
                    }
//                        userRoles.add(roleModel);
                }
            }
            request.getSession().setAttribute(SystemStaticParams.SESSION_USER_PERMS_URL, permUrls); // url
//            request.getSession().setAttribute(SystemStaticParams.SESSION_USER_PERMS_ID, permIds); // id
            Set<String> userRoleNames = userRoles.stream().map(SysRoleModel::getName).distinct().collect(Collectors.toSet());// 已去重
            request.getSession().setAttribute(SystemStaticParams.SESSION_USER_ROLENAMES, userRoleNames); // 角色名称
            user.setUserRoles(userRoles);
        }
    }

    /**
     * 删除用户
     * 
     * @Title delUser
     * @author 吕凯
     * @date 2020年1月6日 下午3:48:10
     * @param id
     *            用户id
     * @return Result
     */
    public Result delUser(Long id) {
        Result checkResult = checkDel(id);
        if (!checkResult.getSuccess()) { // 顶级用户不能删除
            return Web.Response.error(checkResult.getMessage());
        }
        Result result = remove(SystemUser.class, id);
        return Web.Response.result(result);
    }

    /**
     * 检查用户是否可以删除
     * 
     * @Title checkDel
     * @author 吕凯
     * @date 2020年1月6日 下午4:01:24
     * @param id
     * @return Result
     */
    public Result checkDel(Long id) {
        if (id == null) {
            return Web.Response.error("用户不存在！");
        }
        if (id == SystemStaticParams.TOP_MANAGER_ID) { // 顶级用户不能删除
            return Web.Response.error("无删除该用户的权限！");
        }
        Long userId = Web.Util.getSessionUserId(request);
        if (userId.equals(id)) { // 自己也不能删除
            return Web.Response.error("不可删除当前登录用户！");
        }
        return Web.Response.success("");
    }

}
